<?php

class SalariuForm extends BaseSalariuForm
{
    const SALARIAT  = 'nume_salariat';
    const FUNCTIE   = 'functie';
    const VALOARE   = 'valoare';
    const CRITERIU  = 'criteriu_id';
    const DESCRIERE = 'descriere';
    const TARGET    = 'target_id';

    const USER_ID   = App::USER_ID;
    const LUNA      = App::LUNA;

    /**
     * Returneaza lista cu formularele corespunzatoare criteriilor specifice repartizarii salariilor
     *
     * @return array [criteriu_id => criteriu_form]
     */
    public function getCriteriuForms()
    {
        /** Va contine formularele specifice criteriilor; un element este de forma [criteriu_id => form] */
        $forms = array();

        // extrag ID-urile criteriilor folosite
        $criterii = $this->getWidget(self::CRITERIU)->getChoices();
        foreach ($criterii as $criteriuId => $criteriu)
        {
            if (!$criteriuId) continue;

            $criteriuForm = CriteriuPeer::factory($criteriuId)->getForm();
            if ($criteriuForm !== null)
            {
                $criteriuForm->setWrapperName( $this->getFormName() );
                $forms[ $criteriuId ] = $criteriuForm;
            }
        }

        return $forms;
    }

    /**
     * (Re)definire campuri
     */
    protected function configureWidgets()
    {
        // se folosesc doar anumite campuri care vor fi afisate in formular
        $this->useFields(array(self::SALARIAT, self::FUNCTIE, self::VALOARE, self::DESCRIERE, self::CRITERIU, self::TARGET));

        $this->setWidget(self::DESCRIERE, new sfWidgetFormTextarea());

        $this->getWidget(self::CRITERIU)
                ->setOption('criteria', $this->getCriteriuCriteria())
                ->setOption('add_empty', 'Selectaţi modul de repartizare');

        // campul TARGET este populat automat in interfata in momentul salvarii cheltuielii (nu se completeaza manual)
        $this->setWidget(self::TARGET, new sfWidgetFormInputHidden());

        // redefinesc label-urile
        $this->setLabels(array(
            self::VALOARE   => 'Valoare',
            self::CRITERIU  => 'Modul de repartizare',
        ));

    }

    /**
     * (Re)definire validatori
     */
    protected function configureValidators()
    {
        $this->setValidator(self::VALOARE, new ValoareValidator());
        
        $this->getValidator(self::CRITERIU)
                ->setOption('criteria', $this->getCriteriuCriteria());

        $this->setValidator(self::TARGET, new TargetValidator());
    }

    protected function getCriteriuCriteria()
    {
        $criteria = new Criteria();
        $criteria->add(CriteriuPeer::COD, sfConfig::get('app_criterii_salariu'), Criteria::IN);

        return $criteria;
    }

    /**
     * Adaug sub-formularul corespunzator criteriului selectat
     * @param array $taintedValues
     */
    protected function _prepareFormSchema(array $taintedValues)
    {
        $criteriuId = $taintedValues[self::CRITERIU];
        $Criteriu = CriteriuPeer::factory($criteriuId);
        if ( $Criteriu )
        {
            $criteriuForm = $Criteriu->getForm();

            if ( $criteriuForm )
            {
                $this->embedForm( $criteriuForm );

                // adaug post-validatorul pt formularul suplimentar
                $criteriuPostValidator = $criteriuForm->getPostValidator();
                $this->mergePostValidator($criteriuPostValidator);

            }
        }
    }

    /**
     * Se definesc valori implicite pentru anumite campuri, inainte ca acestea sa ajunga in DB
     */
    protected function _updateObject( $values )
    {
        // TARGET trebuie calculat pe baza listei de apartamente selectate
        $values[self::TARGET]   = TargetApartamentPeer::getTargetId($values[self::TARGET], true);

        $values[self::USER_ID]  = UserCriteria::getUserId();
        $values[self::LUNA]     = App::getWorkingMonth();

        return $values;
    }

    protected function _afterSave()
    {
        $embeddedForm = $this->getEmbeddedForm( $this->getName() );

        if ( $embeddedForm )
        {
            $values = $this->getValues();
            $embeddedForm->save( $values[CriteriuForm::NAME], $this->getObject()->getId() );
        }

    }

}
